<?php
/**
 * Устанавливаем, или получаем таймер
 *
 * @param int $timer_id
 * @return int
 */
function timer($timer_id=NULL)
{
	static $timer_set;
	if (!$timer_id)
	{
		if (sizeof($timer_set))
		{
			if (!$timer_id) $timer_id=sizeof($timer_set);
		}
		else
		{
			$timer_id=0;
		}
	}
	
	list($usec, $sec) = explode(" ",microtime()); 
   	$t=((float)$usec + (float)$sec); 
	
	if (isset($timer_set[ $timer_id ]))
	{
		return $t - $timer_set[ $timer_id ];
	}
	else
	{
		$timer_set[ $timer_id ] = $t;
		return $t;
	}
}

/**
 * Получаем дату в красивом формате а-ля "Сегодня, 17:20", "11 сентября, 17:20"
 *
 * @param unknown_type $time
 * @return unknown
 */
function get_date_full($time)
{
	if ( strftime("%d%m%y",$time)==strftime("%d%m%y") )
	{
		return strftime('Сегодня, %H:%M',$time);
	}
	elseif ( strftime("%d%m%y",$time)==strftime("%d%m%y",strtotime("-1 day")) )
	{
		return strftime('Вчера, %H:%M',$time);
	}
	elseif ( strftime("%d%m%y",$time)==strftime("%d%m%y",strtotime("+1 day")) )
	{
		return strftime('Завтра, %H:%M',$time);
	}
	else
	{
		return get_date('%e %Br %H:%M',$time);
	}
}

/**
 * Получаем дату в красивом формате а-ля "Сегодня", "Вчера", "Завтра", "11 сентября"
 *
 * @param int $time
 * @return strin
 */
function get_date_short($time)
{
	if ( strftime("%d%m%y",$time)==strftime("%d%m%y") )
	{
		return 'Сегодня';
	}
	elseif ( strftime("%d%m%y",$time)==strftime("%d%m%y",strtotime("-1 day")) )
	{
		return 'Вчера';
	}
	elseif ( strftime("%d%m%y",$time)==strftime("%d%m%y",strtotime("+1 day")) )
	{
		return 'Завтра';
	}
	else
	{
		return get_date('%e %Br',$time);
	}
}

/**
 * Получаем отфроматированное время
 *
 * @param string $format, кроме стандартных параметров для strftime(), можно задавать %Br, %B, %A
 * @param int $time
 * @return string
 */
function get_date($format,$time=NULL)
{
	//$time=strtotime("2008-08-20 06:07:08");
	$m=array('01'=>'Январь','02'=>'Февраль','03'=>'Март','04'=>'Апрель','05'=>'Май','06'=>'Июнь','07'=>'Июль','08'=>'Август','09'=>'Сентябрь','10'=>'Октябрь','11'=>'Ноябрь','12'=>'Декабрь');
	$mr=array('01'=>'января','02'=>'февраля','03'=>'марта','04'=>'апреля','05'=>'мая','06'=>'июня','07'=>'июля','08'=>'августа','09'=>'сентября','10'=>'октября','11'=>'ноября','12'=>'декабря');
	$w=array('воскресенье','понедельник','вторник','среда','четверг','пятница','суббота',);
	if ($time==NULL) $time=my_time();

	$format=strtr(
		$format,
		array(
			"%Br"=>$mr[strftime("%m",$time)],
			"%B"=>$m[strftime("%m",$time)],
			"%A"=>$w[date("w",$time)],
			"%e"=>date("j",$time),
			//"%time_ago_full%"=>((strftime("%d%m%y",$time)==strftime("%d%m%y"))?strftime('сегодня  %H:%M',$time):(strftime("%d%m%y",$time)==strftime("%d%m%y",strtotime("-1 day")))?strftime('вчера в %H:%M',$time):GetTime('%e %Br %H:%M',$time))
		)
	);
	if ( preg_match("/%time_ago_full%/",$format))
	{
		$format=strtr(
			$format,
			array(
				"%time_ago_full%"=>get_date_full($time),
			)
		);
	}
	if ( preg_match("/%time_ago%/",$format))
	{
		$format=strtr(
			$format,
			array(
				"%time_ago%"=>get_date_short($time),
			)
		);
	}
	/*$format=preg_replace("/%Br/",$mr[strftime("%m",$time)],$format);
	$format=preg_replace("/%B/",$m[strftime("%m",$time)],$format);
	$format=preg_replace("/%A/",$w[date("w",$time)],$format);
	$format=preg_replace("/%e/",date("j",$time),$format);*/
	$str=strftime($format,$time);
	return $str;
}

function truncate($str,$length=200,$end=NULL,$append='')
{
	$result='';
	if (strlen($str)>$length)
	{
		if ($end)
		{
			$result=preg_replace("/^(.{0,$length}.*?$end).*$/su","\\1",$str);
		}
		else
		{
			$result=preg_replace("/^(.{0,$length}).*$/su","\\1",$str);
		}
		return $result;
	}
	else
	{
		return $str;
	}
	
}


/**
 * Сериализуем переменыне
 *
 * @param object $var
 * @return string
 */
function my_serialize($var)
{
	$str=serialize($var);
	return $str;
}

/**
 * Распаковываем переменную
 *
 * @param string $str
 * @return object
 */
function my_unserialize($str)
{
	if (!is_string($str))
	{
		return array();
	}
	$var=unserialize($str);
	return $var;
}

/**
 * нормализуем строку, убираем всякие кавычки и т.п. См. исходник. 
 *
 * @param string $str
 * @return string
 */
function normalize($str)
{
    $str=strtr($str,array(
                        /*chr(171)=>'&laquo;',
                        chr(187)=>'&raquo;',
                        chr(185)=>'&#8470;',
                        chr(151)=>'&#151;',
                        chr(133)=>'&#133;',*/
                        '"'=>'&quot;',
                        "'"=>'&#039;'
                        )
              );
    /*if (get_magic_quotes_gpc()){
        $str=stripslashes($str);
    }else{
    }*/
    //$str=strtr($str,array('"'=>'&quot;'));
    $replacement="strtr(\"<\${1}>\",array(\"&quot;\"=>'\"',\"&#039;\"=>\"\\'\"))";
    $str=preg_replace(
                    "/<(.*?)>/iue",
                    $replacement,
                    $str
                     );
    return $str;
}

/**
 * Проверяем строка email или нет
 *
 * @param string $email
 * @return boolean
 */
function is_email($email)
{
    if (preg_match("/^\w[a-z0-9\._\-]+@\w[a-z0-9\._\-]+\.[a-z]{2,5}$/i",$email))
    {
        return true;
    }
    else
    {
        return false;
    }
}

/**
 * Создаём каталог, аналогично mkdir, но ещё устанавливаем права
 *
 * @param string $dir
 * @param $mode
 */
function my_mkdir($dir,$mode=0777)
{
	if (!is_dir($dir))
	{
		mkdir($dir,$mode);
	}
	chmod($dir,$mode);
}


function my_mkdir_r($dir_to_create,$mode=0777)
{
	global $dir;
	if (!is_dir($dir.$dir_to_create))
	{
		$b=split("/",$dir_to_create);
		array_shift($b);
		foreach ((array)$b as $tmp)
		{
			if (!isset($tmp1)) $tmp1=$tmp;
			else $tmp1.="/".$tmp;
			if (!is_dir($dir."/".$tmp1))
			{
				my_mkdir($dir."/".$tmp1,$mode);
			}
		}
	}
}



/**
 * Возвращаем время, аналогично time()
 *
 * @return int
 */
function my_time()
{
	return time();
}

/**
 * Проверяем инстнциирован $object от $className, или от потомка $className 
 *
 * @param object $object
 * @param string $className
 * @return boolean
 */
function my_is_a($object, $className )
{
	return ((strtolower($className) == strtolower(get_class($object))) or (is_subclass_of($object, $className)));
}

/**
 * Записываем сообщение в log файл
 *
 * @param string $message
 */
function logg($message)
{
	global $dir;
	global $cfg;
	if ( isset($cfg['log']['file']) && $cfg['log']['file'] )
	{
		if ( !is_file($dir.$cfg['log']['file']) ) $fopen_mode='w';
		else $fopen_mode='a';
		if ( isset($cfg['log']['file_size']) && $cfg['log']['file_size'] )
		{
			if ( $fopen_mode=='a' && ( filesize($dir.$cfg['log']['file']) > ($cfg['log']['file_size']*1048576) ) )
			$fopen_mode='w';
		}
		if ( $f=fopen($dir.$cfg['log']['file'],$fopen_mode) )
		{
			$add="";
			fwrite($f,"-- [".date("r")."] -------------\n".$add.$message."\n");
			fclose($f);
		}
		if ( $fopen_mode=='w' )
		{
			chmod($dir.$cfg['log']['file'],0777);
		}
	}
}


function get_random_string($length=20)
{
	$str=str_shuffle("qwertyuiopasdfghjklzxcvbnm1234567890");
	return substr($str,0,$length);
}

?>